<?
class CCache
{
	private $CACHE_DIRECTORY;
	private $CACHE_PATH;
	private $CACHE_TIME;
	private $CACHE_ID;
	private $CACHE_DIR_PERMISSIONS;
	private $CACHE_FILE_PERMISSIONS;

	public function __construct($iCacheTime = NULL, $sCacheId = NULL, $sCachePath = NULL)
	{
		// полный путь до папки с кешем
//		$this->CACHE_DIRECTORY = SYSTEM_DOCUMENT_ROOT.DIRECTORY_SEPARATOR.SYSTEM_DIRECTORY.DIRECTORY_SEPARATOR.SYSTEM_CACHE_DIRECTORY.DIRECTORY_SEPARATOR;
		$this->CACHE_DIRECTORY = SYSTEM_CACHE_PATH;
		
		// относительный путь от главной папки с кешем до самого файла с кешем
		$sCachePath ? $this->CACHE_PATH = $sCachePath : '';
		
		// Время действия кеша
		$iCacheTime ? $this->CACHE_TIME = $iCacheTime : '';
		
		// Идентификатор кеша
		$sCacheId ? $this->CACHE_ID = $sCacheId : '';
		
		$this->CACHE_DIR_PERMISSIONS = 777;
		$this->CACHE_FILE_PERMISSIONS = 777;
	}

	public function Save($sData = NULL)
	{
		if(!$sData) return false;
		if(!$this->CheckCachePath()) return false;
		
		$str_val = serialize($sData);
		$file_name = $this->GetCachePath().$this->GetCacheFilename();
		$f = fopen($file_name, 'w+');
		if (flock($f, LOCK_EX)) {
			fwrite($f, $str_val);
			flock($f, LOCK_UN);
		}
		fclose($f);
		unset($str_val);
	}

	public function Load()
	{
		$file_name = $this->GetCachePath().$this->GetCacheFilename();
		if (!file_exists($file_name)) return false;
		if ((filemtime($file_name) + $this->CACHE_TIME) < time()) return false;
		if (!$data = file($file_name)) return false;
		return unserialize(implode('', $data));
	}

	public function Delete($valueID)
	{
		$file_name = $this->GetCachePath().$this->GetCacheFilename();
		unlink($file_name);
	}

	/**
	 * Метод возвращает путь до файла кеша по параметру $sCacheId - $valueID
	 *
	 * @param unknown_type $valueID
	 * @return unknown
	 */
	private function CheckCachePath()
	{
		$path = $this->CACHE_DIRECTORY.$this->CACHE_PATH;
		if(!file_exists($path) && !mkdir($path, $this->CACHE_DIR_PERMISSIONS, true)) return false;
		return true;
	}

	private function GetCachePath()
	{
		return $this->CACHE_DIRECTORY.$this->CACHE_PATH.DIRECTORY_SEPARATOR;
	}

	private function GetCacheFilename()
	{
		return md5($this->CACHE_ID);
	}

	public function SetCacheId($id = NULL)
	{
		$this->CACHE_ID = $id;
	}
	
	public function SetCacheTime($time = NULL)
	{
		$this->CACHE_TIME = $time;
	}
	
	public function SetCachePath($sCachePath = NULL)
	{
		$this->CACHE_PATH = $sCachePath;
	}
}